Skip to main content

BM12 单链表的排序

BM12 单链表的排序

描述

给定一个节点数为n的无序单链表,对其按升序排序。 示例1 输入:[1,3,2,4,5] 返回值:5

归并排序

package main

import . "nc_tools"

/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/

/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head node
* @return ListNode类
*/
func sortInList(head *ListNode) *ListNode {
if head == nil {
return nil
}
return sortFunc(head)

}
func sortFunc(head *ListNode) *ListNode {
//终止条件
if head.Next == nil {
return head
}

//递
var slow, fast *ListNode
slow = head
fast = head.Next
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
tmp:=slow.Next
slow.Next = nil
leftHead := sortFunc(head)
rightHead := sortFunc(tmp)

//归
var newHead, nowNode *ListNode
newHead = &ListNode{
Val: 0,
}
nowNode = newHead

for leftHead != nil && rightHead != nil {
if leftHead.Val < rightHead.Val {
nowNode.Next = leftHead
leftHead=leftHead.Next
} else {
nowNode.Next = rightHead
rightHead=rightHead.Next
}
nowNode=nowNode.Next
}
if leftHead==nil{
nowNode.Next=rightHead
}else{
nowNode.Next=leftHead
}


newHead = newHead.Next

return newHead

}

总结

之前已经遇到很多次,但还是没有一次写正确,主要还是卡在了临界条件的判断上。首先是终止条件是

if head.Next == nil {
return head
}

然后是进行划分时的临界判断和终止条件的判断

//终止条件
if head.Next == nil {
return head
}
//划分判断
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}

这道题真是不应该了,下次不应在犯同样问题了。